www.gusucode.com > VC++ MFC文档视图程序应用-源码程序 > VC++ MFC文档视图程序应用-源码程序/code/day06_03/codes/MFCMdi/MFCMdi.cpp

    // MFCMdi.cpp : Defines the entry point for the application.
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "resource.h"

class CMyDocument : public CDocument
{
public:
    DECLARE_DYNCREATE( CMyDocument )
public:
    CString m_strText;
};
IMPLEMENT_DYNCREATE( CMyDocument, CDocument )

class CChildView : public CEditView
{
public:
    DECLARE_DYNCREATE( CChildView )
    //文档数据变化后,文档使用
    //UpdateAllViews 通知View
    virtual void OnUpdate( CView* pSender,
       LPARAM lHint, CObject* pHint );
    
    DECLARE_MESSAGE_MAP( )
public:
    afx_msg void OnEnChange( );
};
IMPLEMENT_DYNCREATE( CChildView, CEditView )

BEGIN_MESSAGE_MAP( CChildView, CEditView )
    ON_CONTROL_REFLECT_EX( EN_CHANGE, OnEnChange )
END_MESSAGE_MAP( )

void CChildView::OnEnChange( )
{   //获取View的文档
    CMyDocument * pDoc = (CMyDocument *)
        GetDocument( );
    //保存数据到文档
    GetWindowText( pDoc->m_strText );
    //通知其他View文档数据变化
    pDoc->UpdateAllViews( this );
}

void CChildView::OnUpdate( CView* pSender,
       LPARAM lHint, CObject* pHint )
{
    //获取View的文档
    CMyDocument * pDoc = (CMyDocument *)
        GetDocument( );
    //将数据显示到窗口
    SetWindowText( pDoc->m_strText );
}

class CChildFrame : public CMDIChildWnd
{
public:
    DECLARE_DYNCREATE( CChildFrame )
};
IMPLEMENT_DYNCREATE( CChildFrame, CMDIChildWnd )

class CMainFrame : public CMDIFrameWnd
{
public:
    DECLARE_MESSAGE_MAP( )
public:
    afx_msg void OnNewView( );
};

BEGIN_MESSAGE_MAP( CMainFrame, CMDIFrameWnd )
    ON_COMMAND( ID_NEWVIEW, OnNewView )
END_MESSAGE_MAP( )

void CMainFrame::OnNewView( )
{
    //获取MDI Child Frame窗口
    CFrameWnd * pFrameWnd = GetActiveFrame( );
    if( FALSE == pFrameWnd->IsKindOf( 
        RUNTIME_CLASS(CChildFrame) ) )
    {
        return;
    }
    CChildFrame * pChildFrame = 
        (CChildFrame *)pFrameWnd;
    //获取View窗口
    CChildView * pChildView = (CChildView *)
        pChildFrame->GetActiveView( );
    //获取文档
    CMyDocument * pMyDocument = (CMyDocument *)
        pChildView->GetDocument( );
    //获取文档模板
    CWinApp * pWndApp = AfxGetApp( );
    POSITION pos = pWndApp->m_pDocManager->
        GetFirstDocTemplatePosition( );
        //m_templateList.GetHeadPosition( );
    CDocTemplate * pDocTemplate = 
        pWndApp->m_pDocManager->
        GetNextDocTemplate( pos );
        //m_templateList.GetNext( pos );
    //使用文档模板和文档创建新
    //的MDI Child Frame窗口
    CChildFrame * pNewFrame = (CChildFrame *)
        pDocTemplate->CreateNewFrame( 
        pMyDocument, NULL );
    //刷新窗口
    pDocTemplate->InitialUpdateFrame( pNewFrame,
        pMyDocument );
}

class CMdiApp : public CWinApp
{
public:
    virtual BOOL InitInstance( );

    DECLARE_MESSAGE_MAP( )
public:
    afx_msg void OnNew( );
};

CMdiApp theApp;

BEGIN_MESSAGE_MAP( CMdiApp, CWinApp )
    ON_COMMAND( ID_NEW, OnNew )
END_MESSAGE_MAP( )

BOOL CMdiApp::InitInstance( )
{
    CMultiDocTemplate * pDocTemplate = NULL;
    pDocTemplate = new CMultiDocTemplate( 
        IDR_MAINFRM,
        RUNTIME_CLASS( CMyDocument ),
        RUNTIME_CLASS( CChildFrame ),
        RUNTIME_CLASS( CChildView ) );
    AddDocTemplate( pDocTemplate );

    CMainFrame * pMainWnd = new CMainFrame( );
    pMainWnd->LoadFrame( IDR_MAINFRM );
    m_pMainWnd = pMainWnd;

    m_pMainWnd->ShowWindow( SW_SHOW );
    m_pMainWnd->UpdateWindow( );

    return TRUE;
}

void CMdiApp::OnNew( )
{
    OnFileNew( );
}